package fr.ajicommerce.core.service.implementation;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import fr.ajicommerce.core.dao.interfaces.IPhotoDAO;
import fr.ajicommerce.core.dao.interfaces.IProduitDAO;
import fr.ajicommerce.core.dto.PhotoDTO;
import fr.ajicommerce.core.dto.ProduitDTO;
import fr.ajicommerce.core.entities.Photo;
import fr.ajicommerce.core.entities.Produit;
import fr.ajicommerce.core.service.generics.GenericService;
import fr.ajicommerce.core.service.interfaces.ProduitService;

@Component("produitServiceImpl")
@Transactional
public class ProduitServiceImpl extends GenericService<ProduitDTO, Produit>  implements ProduitService {

	public ProduitServiceImpl(Class<Produit> clazzOfA,
			Class<ProduitDTO> entityClassT) {
		super(clazzOfA, entityClassT);
	}

	public ProduitServiceImpl() {
		super(Produit.class, ProduitDTO.class);
	}

	@Autowired
	IProduitDAO produitDao;
	@Autowired
	IPhotoDAO photoDao;

	// logique métier ici

	// surcharge de save existant dans AbstractService
	@Override 
	public void save(ProduitDTO pDTO) {
		// System.out.println("save ProduitDTO copier les listes photos.");
		Produit a = new Produit();
		ArrayList<Photo> lp = new ArrayList<Photo>();
		List<PhotoDTO> lpDto = pDTO.getListPhotoDTO();
		
		BeanUtils.copyProperties(pDTO, a);
		if (lpDto != null) {
			for (PhotoDTO phDto : lpDto) {
				Photo nPhoto = new Photo();
				BeanUtils.copyProperties(phDto, nPhoto);
				nPhoto.setProduit((Produit)a);
				lp.add(nPhoto);
				}
			}
		((Produit)a).setlistPhotos(lp);
		produitDao.save(a);
		BeanUtils.copyProperties(a, pDTO);
	}

	// surcharge de merge existant dans AbstractService
	// C'EST LA QU'IL FAUT FAIRE LE BOULOT !!!!!!!!! FAIRE LE RESTE !
	@Override 
	public void merge(ProduitDTO pDTO) {
		// System.out.println("merge ProduitDTO copier les listes photos.");
		Produit a = new Produit();
		ArrayList<Photo> lp = new ArrayList<Photo>();
		List<PhotoDTO> lpDto =  pDTO.getListPhotoDTO();
		
		BeanUtils.copyProperties(pDTO, a);
		if (lpDto != null) {
			for (PhotoDTO phDto : lpDto) {
				Photo nPhoto = new Photo();
				BeanUtils.copyProperties(phDto, nPhoto);
				nPhoto.setProduit((Produit)a);
				lp.add(nPhoto);
				}
			}
		((Produit)a).setlistPhotos(lp);
		produitDao.merge(a);
		BeanUtils.copyProperties(a, pDTO);
	}

	@Override
	public ProduitDTO update(ProduitDTO pDTO) {
//		System.out.println("Updating dependency of Produit : PhotoDTO ");		
		Produit a = new Produit();
		ArrayList<Photo> lp = new ArrayList<Photo>();
		BeanUtils.copyProperties(pDTO, a);
		for (PhotoDTO phDto : pDTO.getListPhotoDTO()) {
			Photo nPhoto = new Photo();
			BeanUtils.copyProperties(phDto, nPhoto);
			nPhoto.setProduit((Produit)a);
			lp.add(nPhoto);
			}
		((Produit)a).setlistPhotos(lp);
		produitDao.update(a);
		BeanUtils.copyProperties(a, pDTO);
		return pDTO;
	}
	
	@Override 
	public void detach(ProduitDTO pDTO) {
		// System.out.println("detach ProduitDTO copier les listes photos.");
		Produit a = new Produit();
		List<PhotoDTO> lpDto = pDTO.getListPhotoDTO();
		
		if (lpDto != null) {
			for (PhotoDTO phDto : lpDto) {
				Photo nPhoto = new Photo();
				BeanUtils.copyProperties(phDto, nPhoto);
				photoDao.detach(nPhoto);
				}
			}
		BeanUtils.copyProperties(a, pDTO);
		produitDao.detach(a);
	}

	@Override
	public ProduitDTO findProduitByReference(String reference) {

		ProduitDTO dto = new ProduitDTO();
		Produit dao  = produitDao.findProduitByReference(reference);
		if (dao  == null) {
			return null;
		}
		
		BeanUtils.copyProperties(dao, dto);

		return dto;
	}

	@Override
	public ProduitDTO findProduitByLabel(String label) {

		ProduitDTO dto = new ProduitDTO();
		Produit dao  = produitDao.findProduitByLabel(label);
		if (dao  == null) {
			return null;
		}
		
		BeanUtils.copyProperties(dao , dto);

		return dto;
	}
	
	@Override
	public List<ProduitDTO> findAllProduitsByThisReference(String reference) {
		List<ProduitDTO> listDTO = new ArrayList<>();
		List<Produit> listeProduit  = produitDao.findProduitsByThisReference(reference);
		
		if (listeProduit  == null) {
			return null;
		}
		
		for (Produit p : listeProduit)
		{
			ProduitDTO pDTO = new ProduitDTO();
			
			BeanUtils.copyProperties(p, pDTO);
			
			if(p.getListPhotos() != null)
				pDTO.setListPhotoDTO(new ArrayList<PhotoDTO>());
			
			for (Photo laPhoto : p.getListPhotos())
			{
				PhotoDTO photoDTO = new PhotoDTO();
				BeanUtils.copyProperties(laPhoto, photoDTO);
				photoDTO.setTypePhoto(laPhoto.getTypePhoto());
				pDTO.getListPhotoDTO().add(photoDTO);
			}
			
			listDTO.add(pDTO);
		}
		return listDTO;
	}

	@Override
	public List<ProduitDTO> findAllProduitsByThisLabel(String recherche) {
		List<ProduitDTO> listDTO = new ArrayList<>();
		List<Produit> listeProduit  = produitDao.findProduitsByThisLabel(recherche);
		
		if (listeProduit  == null) {
			return null;
		}
		
		for (Produit p : listeProduit)
		{
			ProduitDTO pDTO = new ProduitDTO();
			
			BeanUtils.copyProperties(p, pDTO);
			
			if(p.getListPhotos() != null)
				pDTO.setListPhotoDTO(new ArrayList<PhotoDTO>());
			
			for (Photo laPhoto : p.getListPhotos())
			{
				PhotoDTO photoDTO = new PhotoDTO();
				BeanUtils.copyProperties(laPhoto, photoDTO);
				photoDTO.setTypePhoto(laPhoto.getTypePhoto());
				pDTO.getListPhotoDTO().add(photoDTO);
			}
			
			listDTO.add(pDTO);
			
		}
		return listDTO;
	}
	
	@Override
	public void addPhoto(long idPhoto) {
		System.out.println("ProduitServiceImpl.addPhoto not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public long createProduit(String description, double prix) {
		System.out.println("ProduitServiceImpl.createProduit not implemented.");		
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void deletePhoto(long idPhoto) {
		System.out.println("ProduitServiceImpl.deletePhoto not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public List<Photo> findPhotosParProduit(Produit produit) {
		System.out.println("ProduitServiceImpl.findPhotosParProduit not implemented.");		
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getCategorie() {
		System.out.println("ProduitServiceImpl.getCategorie not implemented.");		
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void getProduit(long idProduit) {
		System.out.println("ProduitServiceImpl.getProduit not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public void removeProduit(long idProduit) {
		System.out.println("ProduitServiceImpl.removeProduit not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setCategorie(long idCategorie) {
		System.out.println("ProduitServiceImpl.setCategorie not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setDescription(String description) {
		System.out.println("ProduitServiceImpl.setDescription not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public void setPrix(double prix) {
		System.out.println("ProduitServiceImpl.setPrix not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public void updateIdProduit(long idProduit) {
		System.out.println("ProduitServiceImpl.updateIdProduit not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public List<PhotoDTO> getListPhotos(ProduitDTO dproduit) {
		System.out.println("ProduitServiceImpl.getListPhotos not implemented.");		
		// TODO Auto-generated method stub
		
			return null;
	}

	@Override
	public void setListPhotos(List<PhotoDTO> photos) {
		System.out.println("ProduitServiceImpl.setListPhotos not implemented.");		
		// TODO Auto-generated method stub
		
	}

	@Override
	public ProduitDTO findProduitByStrictReference(String reference) {

		ProduitDTO dto = new ProduitDTO();
		Produit dao  = produitDao.findProduitByStrictReference(reference);
		if (dao  == null) {
			return null;
		}
		
		BeanUtils.copyProperties(dao, dto);

		return dto;
	}

	
}

